using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DProximity
{
    /// <summary>
    /// <para>Locate LAS Points By Proximity</para>
    /// <para>Identifies LAS points within the three-dimensional proximity of z-enabled features along with the option to reclassify those points.</para>
    /// <para>识别启用 z 的要素的三维邻近范围内的 LAS 点，以及对这些点进行重分类的选项。</para>
    /// </summary>    
    [DisplayName("Locate LAS Points By Proximity")]
    public class LocateLasPointsByProximity : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public LocateLasPointsByProximity()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_las_dataset">
        /// <para>Input LAS Dataset</para>
        /// <para>The LAS dataset to process.</para>
        /// <para>要处理的 LAS 数据集。</para>
        /// </param>
        /// <param name="_in_features">
        /// <para>Input 3D Features</para>
        /// <para>The 3D point, line, polygon, or multipatch features whose proximity will be used for identifying LAS points.</para>
        /// <para>其邻近度将用于识别 LAS 点的 3D 点、线、面或多面体要素。</para>
        /// </param>
        public LocateLasPointsByProximity(object _in_las_dataset, object _in_features)
        {
            this._in_las_dataset = _in_las_dataset;
            this._in_features = _in_features;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Locate LAS Points By Proximity";

        public override string CallName => "3d.LocateLasPointsByProximity";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "autoCommit", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_las_dataset, _in_features, _search_radius, _count_field, _out_features, _geometry.GetGPValue(), _class_code, _compute_stats.GetGPValue(), _out_las_dataset, _derived_features, _update_pyramid.GetGPValue()];

        /// <summary>
        /// <para>Input LAS Dataset</para>
        /// <para>The LAS dataset to process.</para>
        /// <para>要处理的 LAS 数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input LAS Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_las_dataset { get; set; }


        /// <summary>
        /// <para>Input 3D Features</para>
        /// <para>The 3D point, line, polygon, or multipatch features whose proximity will be used for identifying LAS points.</para>
        /// <para>其邻近度将用于识别 LAS 点的 3D 点、线、面或多面体要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input 3D Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Search Radius</para>
        /// <para>The distance around the input features that will be evaluated for the presence of LAS points, which can be provided as either a linear distance or a numeric field in the input feature's attribute table. If the search radius is derived from a field or a linear distance whose units are specified as Unknown, the linear unit of the input features' XY spatial reference is used.</para>
        /// <para>将评估是否存在 LAS 点的输入要素周围的距离，该点可以作为线性距离或输入要素属性表中的数值字段提供。如果搜索半径派生自单位指定为“未知”的字段或线性距离，则使用输入要素的 XY 空间参考的线性单位。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Search Radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _search_radius { get; set; } = null;


        /// <summary>
        /// <para>Count Field</para>
        /// <para>The name of the field that will be added to the input feature's attribute table and populated with the number of LAS points in each feature's proximity. The default field name is COUNT.</para>
        /// <para>将添加到输入要素属性表中并使用每个要素邻近地区的 LAS 点数填充的字段名称。默认字段名称为 COUNT。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Count Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _count_field { get; set; } = null;


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The point features that represent the LAS points detected within the specified proximity of the input features.</para>
        /// <para>表示在输入要素的指定邻近范围内检测到的 LAS 点的点要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_features { get; set; } = null;


        /// <summary>
        /// <para>Output Geometry Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the geometry of the output point features that represent the LAS points found within the specified proximity of the input features.</para>
        ///   <bulletList>
        ///     <bullet_item>Multipoint—Multipoint features that will have multiple points in each row.</bullet_item><para/>
        ///     <bullet_item>Point—Single-point features that will have a unique row for each identified LAS point.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输出点要素的几何，这些输出点要素表示在输入要素的指定邻近范围内找到的 LAS 点。</para>
        ///   <bulletList>
        ///     <bullet_item>多点 - 每行中将包含多个点的多点要素。</bullet_item><para/>
        ///     <bullet_item>点 - 对于每个识别的 LAS 点，将具有唯一行的单点要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Geometry Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _geometry_value _geometry { get; set; } = _geometry_value._MULTIPOINT;

        public enum _geometry_value
        {
            /// <summary>
            /// <para>Multipoint</para>
            /// <para>Multipoint—Multipoint features that will have multiple points in each row.</para>
            /// <para>多点 - 每行中将包含多个点的多点要素。</para>
            /// </summary>
            [Description("Multipoint")]
            [GPEnumValue("MULTIPOINT")]
            _MULTIPOINT,

            /// <summary>
            /// <para>Point</para>
            /// <para>Point—Single-point features that will have a unique row for each identified LAS point.</para>
            /// <para>点 - 对于每个识别的 LAS 点，将具有唯一行的单点要素。</para>
            /// </summary>
            [Description("Point")]
            [GPEnumValue("POINT")]
            _POINT,

        }

        /// <summary>
        /// <para>New Class Code</para>
        /// <para>The class code value that will be used to reclassify the points found within the search radius of the input features.</para>
        /// <para>将用于对输入要素搜索半径内找到的点进行重分类的类代码值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("New Class Code")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long? _class_code { get; set; } = null;


        /// <summary>
        /// <para>Compute statistics</para>
        /// <para><xdoc>
        ///   <para>Specifies whether statistics will be computed for the .las files referenced by the LAS dataset. Computing statistics provides a spatial index for each .las file, which improves analysis and display performance. Statistics also enhance the filtering and symbology experience by limiting the display of LAS attributes, such as classification codes and return information, to values that are present in the .las file.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Statistics will be computed. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Statistics will not be computed.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否为 LAS 数据集引用的 .las 文件计算统计数据。计算统计为每个 .las 文件提供空间索引，从而提高分析和显示性能。统计数据还通过将 LAS 属性（如分类代码和返回信息）的显示限制为 .las 文件中存在的值来增强过滤和符号系统体验。</para>
        ///   <bulletList>
        ///     <bullet_item>选中—将计算统计数据。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中—不计算统计数据。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Compute statistics")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _compute_stats_value _compute_stats { get; set; } = _compute_stats_value._true;

        public enum _compute_stats_value
        {
            /// <summary>
            /// <para>COMPUTE_STATS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("COMPUTE_STATS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_COMPUTE_STATS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_COMPUTE_STATS")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Updated Input LAS Dataset</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Input LAS Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_las_dataset { get; set; }


        /// <summary>
        /// <para>Updated Input 3D Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Input 3D Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_features { get; set; }


        /// <summary>
        /// <para>Update pyramid</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the LAS dataset pyramid will be updated after the class codes are modified.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—The LAS dataset pyramid will be updated. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—The LAS dataset pyramid will not be updated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定修改类代码后是否更新 LAS 数据集金字塔。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 将更新 LAS 数据集金字塔。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中—LAS 数据集金字塔将不会更新。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Update pyramid")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _update_pyramid_value _update_pyramid { get; set; } = _update_pyramid_value._true;

        public enum _update_pyramid_value
        {
            /// <summary>
            /// <para>UPDATE_PYRAMID</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("UPDATE_PYRAMID")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_UPDATE_PYRAMID</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_UPDATE_PYRAMID")]
            [GPEnumValue("false")]
            _false,

        }

        public LocateLasPointsByProximity SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}